import { BrowserWindow, ipcMain } from 'electron'
import { join } from 'path'
/**
 * 预览窗口管理器
 * 负责创建和管理文件预览窗口
 */
export class PreviewWindowManager {
  private previewWindow: BrowserWindow | null = null

  constructor() {
    // 构造函数中注册IPC处理器
    this.registerHandlers()
  }

  /**
   * 初始化预览窗口管理器
   */
  public initialize(): void {
    console.log('预览窗口管理器初始化完成')
  }

  /**
   * 注册IPC处理器
   */
  private registerHandlers(): void {
    // 处理打开文件预览请求
    ipcMain.handle('open-file-preview', (_, fileData) => {
      this.openPreview(fileData)
      return true
    })

    // 处理关闭预览窗口请求
    ipcMain.on('close-preview-window', () => {
      if (this.previewWindow) {
        this.previewWindow.close()
      }
    })
  }

  /**
   * 打开预览窗口
   * @param fileData 文件数据对象
   */
  private openPreview(fileData: {
    name?: string
    path?: string
    type?: string
    data?: unknown
  }): void {
    // 如果已存在窗口，则关闭它
    if (this.previewWindow) {
      this.previewWindow.close()
      this.previewWindow = null
    }

    // 创建新的预览窗口
    this.previewWindow = new BrowserWindow({
      width: 900,
      height: 700,
      show: false,
      autoHideMenuBar: true,
      ...(process.platform === 'linux'
        ? { icon: join(__dirname, '../../resources/icon.png') }
        : {}),
      webPreferences: {
        preload: join(__dirname, '../preload/index.js'),
        sandbox: false,
        contextIsolation: true,
        nodeIntegration: true
      }
    })

    // 设置窗口标题
    this.previewWindow.setTitle(`预览：${fileData.name || '未命名文件'}`)

    // 窗口准备好后显示
    this.previewWindow.once('ready-to-show', () => {
      this.previewWindow?.show()
      // 发送文件数据到渲染进程
      this.previewWindow?.webContents.send('file-to-preview', fileData)
    })

    // 窗口关闭时清理引用
    this.previewWindow.on('closed', () => {
      this.previewWindow = null
    })
  }
}
